/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Objetos.CondicaoePagamento;
import Objetos.Usuario;
import DAO.AccessDatabase;
import java.awt.HeadlessException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
 *
 * @author celio
 */
public class RepositorioCondPag implements RepositorioCondPagInterface {

    @Override
    public void adicionar(CondicaoePagamento cond, Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `condicoes` (`descricaocondicao`,`num_parcelascondicao`,`data_inclusaocondicao`) VALUES ('" + cond.getDescricao() + "','" + cond.getParcelas() + "','" + cond.getData_inclusao() + "');");
            con.close();

            JOptionPane.showMessageDialog(null, "Condição cadastrada com sucesso!!!");
            Funcoes.funcoes.geraLog(" ", "Usuário: " + usu.getNome() + " | Adicionou a Condição de pagamento " + cond.getDescricao() + " e " + cond.getParcelas() + " parcela(s) às ");

        } catch (SQLException | HeadlessException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public CondicaoePagamento procurar(String cod,Usuario usu) {

        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM condicoes  WHERE idcondicao = '" + cod + "'");
            rs.next();

            CondicaoePagamento cond = new CondicaoePagamento();
            cond.setCod_CondPag(rs.getString("idcondicao"));
            cond.setDescricao(rs.getString("descricaocondicao"));
            cond.setParcelas(rs.getString("num_parcelascondicao"));

            con.close();
            return cond;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public Vector<CondicaoePagamento> todas(Usuario usu) {

        Vector retorno = new Vector();
        retorno.addElement(" ");
        CondicaoePagamento cond;
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM condicoes");
            while (rs.next()) {

                cond = new CondicaoePagamento();
                cond.setCod_CondPag(rs.getString("idcondicao"));
                cond.setDescricao(rs.getString("descricaocondicao"));
                cond.setParcelas(rs.getString("num_parcelascondicao"));

                retorno.addElement(cond.getCod_CondPag() + " - " + cond.getDescricao());
            };

            con.close();
            return retorno;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public void alterar(CondicaoePagamento antigo, CondicaoePagamento alterado, Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("UPDATE `condicoes` SET `descricaocondicao`='" + alterado.getDescricao() + "', `num_parcelascondicao`='" + alterado.getParcelas() + "' WHERE `idcondicao`='" + antigo.getCod_CondPag() + "'");
            con.close();

            JOptionPane.showMessageDialog(null, "Condição alterada com sucesso!!!");
            Funcoes.funcoes.geraLog(" ", "Usuário: " + usu.getNome() + " | Alterou a Condição de pagamento " + antigo.getDescricao() + " e " + antigo.getParcelas() + " parcela(s) para " + alterado.getDescricao() + " e " + alterado.getParcelas() + " parcela(s) às ");

        } catch (SQLException | HeadlessException t) {

            JOptionPane.showMessageDialog(null, "Registro não inserido!!! Inconsistência nos valores inseridos - " + t.getMessage());

        }

    }

    @Override
    public JTable consultaTodos(Usuario usu) {

        try {
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            JTable tabela;
            try (Connection con = a.conectar()) {
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery("SELECT * FROM condicoes ORDER BY idcondicao");
                rs.next();
                ResultSetMetaData rsmd = rs.getMetaData();
                cabecalho.addElement("Cód");
                cabecalho.addElement("Descrição");
                cabecalho.addElement("Parcelas");

                do {
                    linhas.addElement(proximaLinha(rs, rsmd));
                } while (rs.next());
                tabela = new JTable(linhas, cabecalho);
            }
            tabela.getColumnModel().getColumn(0).setPreferredWidth(100);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(250);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(300);

            return tabela;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd) throws SQLException {
        Vector LinhaAtual = new Vector();

        try {
            for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
                switch (rsmd.getColumnType(i)) {
                    case Types.VARCHAR:
                        LinhaAtual.addElement(rs.getString(i));
                        break;
                    case Types.TIMESTAMP:
                        LinhaAtual.addElement(rs.getDate(i).toLocaleString().substring(0, 10));
                        break;
                    case Types.INTEGER:
                        LinhaAtual.addElement(rs.getInt(i));
                        break;
                    case Types.DECIMAL:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;
                    case Types.DOUBLE:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;

                }
            }
        } catch (SQLException e) {
        }
        return LinhaAtual;

    }

}
